package net.callumtaylor.asynchttp.obj.entity;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.http.HttpEntity;
import org.apache.http.entity.HttpEntityWrapper;
public class ProgressEntityWrapper extends HttpEntityWrapper
{
private final ProgressListener listener;
public ProgressEntityWrapper(HttpEntity e, ProgressListener listener)
{
super(e);
this.listener = listener;
}
@Override public long getContentLength()
{
return this.wrappedEntity.getContentLength();
}
@Override public void writeTo(final OutputStream outstream) throws IOException
{
super.writeTo(new CountingOutputStream(outstream, this.listener));
}
public static interface ProgressListener
{
public void onBytesTransferred(byte[] buffer, int len, long transferred);
}
public static class CountingOutputStream extends FilterOutputStream
{
private final ProgressListener listener;
private long transferred;
public CountingOutputStream(final OutputStream out, final ProgressListener listener)
{
super(out);
this.listener = listener;
this.transferred = 0;
}
@Override public void write(byte[] buffer) throws IOException
{
super.write(buffer);
}
@Override public void write(byte[] b, int off, int len) throws IOException
{
out.write(b, off, len);
this.transferred += len;
this.listener.onBytesTransferred(b, len, this.transferred);
}
@Override public void write(int b) throws IOException
{
out.write(b);
this.transferred++;
this.listener.onBytesTransferred(null, 1, this.transferred);
}
}
}